package main

import (
	"fmt"
	"os"
)

func main() {
	/*
		4.常用函数：
		（1）func Printf(format string, a ...interface{}) (n int, err error)
			Printf 根据 format 参数生成格式化的字符串并写入标准输出。
			参数类型为 interface{}，这意味着你可以传递零个或者多个任意类型参数给它，都能被正确打印。
			返回写入的字节数和遇到的任何错误。

		（2）func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
			Fprintf 根据 format 参数生成格式化的字符串并写入 w。
			返回写入的字节数和遇到的任何错误。

		（3）func Sprintf(format string, a ...interface{}) string
			Sprintf 根据 format 参数生成格式化的字符串并返回字符串。

		（4）func Print(a ...interface{}) (n int, err error)
			Print 采用默认格式将其参数格式化并写入标准输出。
			如果两个相邻的参数都不是字符串，会在它们的输出之间添加空格。返回写入的字节数和遇到的任何错误。

		（5）func Fprint(w io.Writer, a ...interface{}) (n int, err error)
			Fprint 采用默认格式将其参数格式化并写入 w。
			如果两个相邻的参数都不是字符串，会在它们的输出之间添加空格。
			返回写入的字节数和遇到的任何问题。

		（6）func Sprint(a ...interface{}) string
			Sprint 采用默认格式将其参数格式化，串联所有输出生成并返回一个字符串。
			如果两个相邻的参数都不是字符串，会在它们的输出之间添加空格。

		（7）func Println(a ...interface{}) (n int, err error)
			Println 采用默认格式将其参数格式化并写入标准输出。
			总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符。
			返回写入的字节数和遇到的任何错误。

		（8）func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
			Fprintln 采用默认格式将其参数格式化并写入 w。
			总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符。
			返回写入的字节数和遇到的任何错误。

		（9）func Sprintln(a ...interface{}) string
			Sprintln 采用默认格式将其参数格式化，串联所有输出生成并返回一个字符串。
			总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符。

		（10）func Errorf(format string, a ...interface{}) error
			Errorf 根据 format 参数生成格式化字符串并返回一个包含该字符串的错误。

		（11）func Scanf(format string, a ...interface{}) (n int, err error)
			Scanf 从标准输入扫描文件，根据 format 参数指定的格式将 成功读取的空白分隔的值 保存进 成功传递给本函数的参数。
			返回成功扫描的条目个数和遇到的任何错误。

		（12）func Fscanf(str string, format string, a ...interface{}) (n int, err error)
			Fscanf 从 r 扫描文本，根据 format 参数指定的格式将 成功读取的空白分隔的值 保存进 成功传递给本函数的参数。
			返回成功扫描的条目个数和遇到的任何错误。

		（13）func Sscanf(str string, format string, a ...interface{}) (n int, err error)
			Sscanf 从字符串 str 扫描文本，根据 format 参数指定的格式将 成功读取的空白分隔的值 保存进 成功传递给本函数的参数。
			返回成功扫描的条目个数和遇到的任何错误。

		（14）func Scan(a ...interface{}) (n int, err error)
			Scan 从标准输入扫描文本，将 成功读取的空白分隔的值 保存进 成功传递给本函数的参数。
			换行视为 空白。
			返回成功扫描的条目个数和遇到的任何错误。
			如果 读取的条目 比 提供的参数 少，会返回一个错误报告原因。

		（15）func FScan(r io.Reader, a ...interface{}) (n int, err error)
			Fscan 从 r 扫描文本，将 成功读取的空白分隔的值 保存进 成功传递给本函数的参数。
			换行视为 空白。
			返回成功扫描的条目个数和遇到的任何错误。
			如果 读取的条目 比 提供的参数 少，会返回一个错误报告原因。

		（16）func Sscan(str string, a ...interface{}) (n int, err error)
			Sscan 从字符串 str 扫描文本，将 成功读取的空白分隔的值 保存进 成功传递给本函数的参数。
			换行视为 空白。
			如果 读取的条目 比 提供的参数 少，会返回一个错误报告原因。

		（17）func Scanln(a ...interface{}) (n int, err error)
			Scanln 类似 Scan，但会在换行时才停止扫描。
			最后一个条目后必须 有换行 或者 到达结束位置。

		（18）func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
			Fscanln 类似 Fscan，但会在换行时才停止扫描。
			最后一个条目后必须 有换行 或者 到达结束位置。

		（19）func Sscanln(str string, a ...interface{}) (n int, err error)
			Sscanln 类似 Sscan，但会在换行时才停止扫描。
			最后一个条目后必须 有换行 或者 到达结束位置。

	*/
	fmt.Println("-----------Printf、Fprintf、Sprintf 区别----------")
	a := "hello"
	b := "world"
	fmt.Printf("Printf is %s %s\n", a, b)
	fmt.Fprintf(os.Stdout, "Fprintf is %s+++++%s\n", a, b)
	ret := fmt.Sprintf("Sprintf is %s=====%s\n", a, b)
	fmt.Printf("ret is %s", ret)
	/*结果：
	Printf is hello world
	Fprintf is hello+++++world // 该打印是 os.Stdout 的输出，并不是 Fprintf 的输出
	ret is Sprintf is hello=====world
	*/

	fmt.Println("-----------Print、Fprint、Sprint 区别-------------")
	a1 := "hello"
	b1 := "world"
	fmt.Print("Print: ", a1, b1, "\n")
	fmt.Fprint(os.Stdout, "Fprint: ", a1, b1, "\n")
	ret1 := fmt.Sprint("Sprint: ", a1, b1, "\n")
	fmt.Print("ret: ", ret1)
	/*结果：
	Print: helloworld
	Fprint: helloworld // 该打印是 os.Stdout 的输出
	ret: Sprint: helloworld
	*/

	fmt.Println("---------Println、Fprintln、Sprintln 区别------------")
	a2 := "hello"
	b2 := "world"
	fmt.Println("Println: ", a2, b2)
	fmt.Fprintln(os.Stdout, "Fprintln: ", a2, b2)
	ret2 := fmt.Sprintln("Sprintln: ", a2, b2)
	fmt.Println("ret: ", ret2)
	/*结果：
	Println:  hello world
	Fprintln:  hello world // 该打印是 os.Stdout 的输出
	ret:  Sprintln:  hello world
	*/

}
